#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#define NBTELEPHONE 5
#define SUCCESS 0
#define FAILURE -1

// Variables globales au Standard -----------------------------------------------------

int annuaire[NBTELEPHONE];
int nb_tel = 0; 
//-------------------------------------------------------------------------------------

//Fonction qui retourne le nombre de téléphones présents
int getNbTel()
{
	return nb_tel;
}

// Fonction qui retourne le numéro du téléphone donné en paramètre
int getNumero(int indice_tel)
{
	return annuaire[indice_tel];
}

// Initialisation du Standard
void initAnnuaire()
{
	FILE *monFile;	 
	FILE *monFile2;
	char ligne[50];
	
	int deb_balise=0;
	int fin_balise=0;
	
	int i, j, k;
	
	char tablo[50];
	char * numero= malloc(256*sizeof(char));
	 
	int num;
	
	int trouve = 0;
	
	// ouverture du fichier XML en lecture
	monFile=fopen("reseau_telephonique.xml","r");

	// tant qu'on est pas a la fin du fichier XML
	while(!feof(monFile))
	{	
		// on recupère la ligne courante
		fgets(ligne, 50, monFile);
		
		// on verifie si elle ne contient pas les balises <numeroFixe> et </numeroFixe>
		deb_balise =(int) strstr(ligne,"<numeroFixe>");
		fin_balise =(int) strstr(ligne,"</numeroFixe>");
		
		// si la ligne contient la balise alors on effectue le traitement
		if(deb_balise!=0)
		{					
			// récupération de la ligne dans un tableau
			for(j=0;j<50;j++)
			{	
				// suppression des espaces et tabulations et enregistrement dans un tableau			
				if((ligne[j]!='\t')||(ligne[j]!=' '))
				{
					tablo[j]=ligne[j];
				}			
			}
			
			// supression de la balise <numeroFixe>
			k=0;
			while(tablo[k]!='>')
			{
				k++;
			}
			
			// recuperation du numero
			trouve = 0;
			for(j=(k+1);((j<50)&&(trouve==0));j++)
			{	
				// si on arrive pas sur la balise de fin			
				if(tablo[j]!='<')
				{	
					// si c'est le premier caractère qu'on enregistre alors on le met directement dans la variable
					if(j==(k+1))
					{
						sprintf(numero,"%c",tablo[j]);	
					}
					else // sinon on l'ajoute
					{
						sprintf(numero,"%s%c",numero,tablo[j]);	
					}
				}
				else // sinon le numero est enregistré --> on sort du for
				{
					trouve=1;
				}				
			}
			
			// enregistrement du numero dans un fichier tampon
			// si c'est le premier numero a enregistrer alors on ouvre le fichier en écriture et on écrit le numéro
			if(nb_tel==0)
			{
				monFile2=fopen("annuaire.txt","w");
				fprintf(monFile2,numero);
				nb_tel = nb_tel + 1;
				fclose(monFile2);
			}
			else // sinon on rajoute a la suite du fichier tampon le numero
			{
				monFile2=fopen("annuaire.txt","a");
				fprintf(monFile2,"\n");
				fprintf(monFile2,numero);
				nb_tel = nb_tel + 1;
				fclose(monFile2);
			}			
		}
			
	 }	
	 fclose(monFile);
	 
	 // on ouvre le fichier tampon en lecture
	 monFile=fopen("annuaire.txt","r");
	 
	 nb_tel = 0;
	 // tant qu'on est pas arrivé à la fin du fichier, on enregistre les numero dans le tableau
	 while(!feof(monFile))
	 {
	 	// récupération de la ligne
	 	fgets(ligne, 50, monFile);
		// convertion du string en entier
		num = atoi(ligne);
		//enregistrement
		annuaire[nb_tel] = num;
		// incrémentation du nombre de telephone
		nb_tel = nb_tel + 1;
	 }
	 
	 unlink("annuaire.txt");
	 
	 /*
	 // affichage de l'annuaire
	 for(i=0;i<nb_tel;i++)
	 {
	 	printf("num %d : %d\n",i,annuaire[i]);
	 }	
	 */
	  
}
// Thread de demande de connexion entre deux téléphones
int CONNEXION(int exp, int dest){
	printf("%d appelle %d\n",exp,dest);
	if(estDansAnnuaire(dest,annuaire) == -1){
		return FAILURE;
	}
	printf("Standard: Connexion en cours\n");
	return SUCCESS;
}
// Constructeur de processus Standard, il doit retourner le PID de celui ci
int STANDARD(){
	pid_t numStandard;
	initAnnuaire();
	int i;

	for(i=0;i<getNbTel();i++)
	{
		printf("tel %d : %d\n",(i+1),annuaire[i]);
	}

	printf("Creation du Standard:");
	switch(numStandard=fork()){
		case -1:	perror("Erreur lors de la creation du Standard:"); break;
		case 0:		// Processus Standard
				while(1){
					//printf("Je suis le standard %d\n",(int)numStandard);break;
				}
		default:	break;
	}
	return (int)numStandard;
}

int estDansAnnuaire(int entier, int tab_de_recherche[])
{
	int i = 0;
	int trouve = 0;

	while((trouve==0)&&(i<=NBTELEPHONE)){
   	       if(tab_de_recherche[i]==entier)
   		   {
  		         trouve = 1;
		   }
		   i++;				      	  			   
	}

	if(trouve==1){
		return SUCCESS; 
	}
	else{
		return FAILURE;
	} 	
}




